package org.fall.mvc.handler;

import com.atguigu.crowd.util.ResultEntity;
import com.atguigu.crowd.entity.Menu;
import org.fall.service.api.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class MenuHandler {

    @Autowired
    private MenuService menuService;


    @ResponseBody
    @RequestMapping("menu/remove.json")
    public ResultEntity<String> removeMenu(@RequestParam("id") Integer id) {

        menuService.removeMenu(id);
        return ResultEntity.successWithoutData();
    }


    @ResponseBody
    @RequestMapping("menu/edit.json")
    public ResultEntity<String> editMenu(Menu menu) {

        menuService.updateMenu(menu);
        return ResultEntity.successWithoutData();
    }


    @ResponseBody
    @RequestMapping("menu/save.json")
    public ResultEntity<String> saveMenu(Menu menu) {

        menuService.saveMenu(menu);

        return ResultEntity.successWithoutData();

    }


    @ResponseBody
    @RequestMapping("/menu/do/get.json")
    public ResultEntity<Menu> getWholeTree() {

        // 1、查询全部的Menu对象
        List<Menu> menuList = menuService.getAll();

        // 2、声明一个Menu对象root，用来存放找到的根节点
        Menu root = null;

        // 使用map表示每一个菜单与id的对应关系
        Map<Integer, Menu> menuMap = new HashMap<>();
        // 3、将菜单id与菜单对象以K-V对模式存入map
        for (Menu menu : menuList) {
            menuMap.put(menu.getId(), menu);
        }

        // 4、再次遍历menuList
        for (Menu menu : menuList) {

            // 5、获取当前menu对象的pid属性值
            Integer pid = menu.getPid();

            // 6、pid为null表示该menu是根节点
            if (pid == null) {
                root = menu;
                continue;
            }

            // 如果pid不为null，通过当前遍历的menu的pid得到其父节点
            Menu father = menuMap.get(pid);

            // 将当前节点存入父节点的children集合
            father.getChildren().add(menu);
        }

        // 将根节点作为data返回（根节点包含整个树形结构，返回根节点也就返回了整棵树）
        return ResultEntity.successWithData(root);
    }

}
